package com.javatest.springbootquartz.job;


import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;

/**
 * Created with IntelliJ IDEA.
 * Description:
 *
 * 创建job 实例工厂，解决spring注入问题，
 * 如果使用默认会导致spring的@Autowired 无法注入问题.
 *
 * 定时任务Job对象的实例化过程是在Quartz中进行的，
 * 而注入的Bean是由Spring容器管理的，
 * Quartz根本就察觉不到注入Bean的存在，
 * 故而无法将注入的Bean装配到Job对象中。 
 * 如果能够将Job Bean也纳入到Spring容器的管理之中的话，Spring容器自然能够为Job Bean自动装配好所需的依赖。
 *
 * @author liuziyang
 * @create 2019-07-02 22:30
 */
@Primary
@Component
public class JobFactory extends AdaptableJobFactory {

    /**
     * 需要使用这个BeanFactory对Quartz创建好Job实例进行后续处理，属于Spring的技术范畴.
     */
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        // 首先，调用父类的方法创建好Quartz所需的Job实例
        Object jobInstance = super.createJobInstance(bundle);
        // 然后，使用BeanFactory为创建好的Job实例进行属性自动装配并将其纳入到Spring容器的管理之中，属于Spring的技术范畴.
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }

}
